#include <iostream>
using namespace std;

class Student{
    private:
        string name;
        int age;
    public:
        // 静态成员变量 也受访问控制权限的控制
        static int count;
        Student(string n, int a)\
            :name(n), age(a)\
            //, count(0)\{ // 报错 静态成员变量只能在全局处初始化
            {
            // 每次实例化对象时 count++
            count++;
        }
        ~Student(){
            // 每次消亡对象时 count--
            count--;
        }
        // 静态成员函数类内定义的写法:
        // static void show_info(){
        //     // cout << name << endl; // 由于静态成员函数没有this指针 
        //     // cout << age << endl; // 不能访问普通的成员变量
        //     cout << count << endl;
        // }
        // 类内声明  需要加static
        static void show_info();
};

// 类外定义的写法  类外定义时无需加 static
void Student::show_info(){
    // cout << name << endl; // 由于静态成员函数没有this指针 
    // cout << age << endl; // 不能访问普通的成员变量
    cout << count << endl;
}

// 静态成员变量 类外全局处初始化的方式
int Student::count = 0;

int main(int argc, const char *argv[]){
    Student s1("张三", 18);
    // 静态成员函数的访问方式1：通过类对象访问
    s1.show_info();
    cout << "--------" << endl;

    Student *p1 = new Student("李四", 20);
    // 静态成员函数的访问方式2：通过类指针访问
    p1->show_info();
    cout << "--------" << endl;

    // 静态成员函数的访问方式3：直接通过 类名:: 访问
    Student::show_info();

    delete p1;
    p1 = nullptr;

    return 0;
}